package vengadores;

import java.io.IOException;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;

    /**
     * Una instancia de esta clase se usa para crear el Juego en el cual se manejarán todos los eventos
     * que tengan que ver con el juego en concreto.
     * Usa, además, LayerManagers para manejar los eventos de las plataformas y del shooter por separado.
     * @author Felipe Donato Arrazola Gómez
     * @author Jorge de Jesús Tinoco Huesca
     * @author Arturo Ayala Tello
     */

public class Juego extends GameCanvas implements Animable {
    /**
     * Indica la cantidad de pixeles que siempre se mueve el personaje en +Y para simular el efecto de la gravedad.
     */
    public static final int GRAVEDAD = 10;
    private int nivel;//Indica el nivel del juego.
    private AdminPlataforma adminPlataforma; //es el objeto que maneja el juego en plataformas.
    private AdminShooter adminShooter; // es el objeto que maneja el juego en Shooter.
    private Graphics g; // es el objeto de Graphics donde se dibujan los elementos del juego.
    private int ANCHO, ALTO; //es el alto y el ancho de la pantalla.
    private Animador animador; //es el objeto que anima el juego, actualizándolo.
    private AppJuego midlet;// es el midlet donde se ejecuta el juego.
    private int sexoPersonaje; // es el sexo del personaje escogido por el jugador.
    private boolean pausado; // indica si el juego está pausado o no.
    private boolean botonApretado = false; // bandera para verificar si un botón se presionó.
    private int puntosControl[]; // números que controlan en qué parte del juego se cambia de plataforma a shooter.
    private int puntoControlActual; // indica cual es el punto de control más cercano.
    private Image corazon1,corazon2,vida; // imágenes utilizadas para el juego pausado y las imágenes que representan la sangre del personaje.
    private Reloj reloj; // indica el tiempo del juego.
    private int seg, min; // usados por el reloj para indicar el tiempo.
    private boolean estaShooter;//usada para saber si el estado del juego es del modo de Shooter
    private int vidasPersonaje, sangrePersonaje, xPersonaje, yPersonaje; // indican la sangre y la posición del personaje.
    private Sprite imagenPausa; //sprite para dibujar la pausa
    private Image mira; //Imagen de la mira usada para la pausa
    private final int yCont = 17;//posición en y de la mira para el menú principal de la
    private final int yRein = 76;//posicion en y para la opción de reiniciar
    private final int yOpcion = 145;//posición en y para la opcion de Opciones
    private final int yAyuda = 210;//posición en y para la opción de Ayuda
    private final int ySalir = 272;//posición en y para la opción de Salir
    private final int yMenu[] = {17,76,145,210,272};//Arreglo de posiciones para mover la mira
    private int yMenuSel;//variable que dice el índice donde se encuentra la mira en el menú principal
    private final int ySegRein = 215;//posición en y para el menu de reiniciar
    private int xSegRein; //posición en x para el menu de reiniciar
    private final int xSiRein = 75;//posición que guarda la opcion de sí
    private final int xNoRein = 158;// posición en x que guarda la opción en no
    private int xSelVib;//posición en x para la selección de vibración
    private int xSelSon;//posición en x para seleccionar reproducción
    private final int xSiOp = 73;//posición en x para decir si
    private final int xNoOp = 153;//posición en x para decir no
    private final int yVibOp = 90;//posicion en y para seleccionar vibracion
    private final int ySonOp = 221;//posición en y para seleccionar reproducción
    private int xOpSal;//x que guarda la posición de opcions salir
    private final int xSiSal=76;//posición en x para decir si a salir
    private final int xNoSal=158;// posición en x para decir que no al salir
    private final int ySal =192;//posición en y de las opciones de salir
    private int ySeleccion;//posición en y para seleccionar en el menú principal
    private boolean pausaCreada = false; // nos indica si la pausa está creada
    private int puntajeGlobal, puntajeTemp; //para el manejo de puntajes
    private StringBuffer info; //para el manejo de cadenas y formar la información a desplegar
    private String tiempo, scoreDesplegado;//cadena de caracteres que guardan lo regresado por el stringBuffer
    /**
     *Constructor de la clase. Construye el objeto que hereda de GameCanvas donde se manejará el juego completo.
     * @param app Es el midlet donde se mandará llamar el GameCanvas.
     * @param sexo Indica el sexo del personaje que eligió el jugador.
     * @param nivel Es el nivel del juego en el que se encuentra el jugador.
     */
    public Juego(AppJuego app,int sexo, int nivel, int score){
        super(true);
        this.sexoPersonaje = sexo;
        puntajeGlobal = score;
        puntajeTemp = score;
        midlet = app;
        setFullScreenMode(true);
        ANCHO = getWidth();
        ALTO = getHeight();
        g = getGraphics();
        this.nivel = nivel;
        adminPlataforma = new AdminPlataforma(this, ANCHO, ALTO,sexo, this.nivel);
        adminPlataforma.puntaje = puntajeGlobal;
        pausado = false;
        try {
            corazon1 = Image.createImage("/corazon1.png");
            corazon2 = Image.createImage("/corazon2.png");
            vida = Image.createImage("/Vida" + sexo + ".png");
            if(midlet.deseaReproducir()){
                switch(this.nivel){
                    case 1:
                        midlet.reproducir("contrabando.mid");
                        break;
                    case 2:
                        midlet.reproducir("Clavado.mid");
                        break;
                    case 3:
                        midlet.reproducir("nymphetamine.mid");
                        break;
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        xPersonaje = adminPlataforma.heroe.getX();
        yPersonaje = adminPlataforma.heroe.getY();
        setControl();
        reloj = new Reloj();
        seg = 0;
        min = 0;
        info = new StringBuffer();
        animador = new Animador(this);
        animador.iniciar();
    }

    /**
     * Constructor que se manda invocar cuando el juego ha sido guardado con anterioridad
     * @param app es el la aplicación a la cual pertenece el juego
     * @param sexo entero que guarda el sexo del personaje
     * @param nivel entero que representa el nivel a crear
     * @param score entero que representa el puntaje guardado
     * @param estaEnShooter valor booleano que nos dice si estaba en modo shooter o no
     */
    public Juego(AppJuego app,int sexo, int nivel, int score, boolean estaEnShooter){
        this(app,sexo,nivel,score);
        estaShooter = estaEnShooter;
        xPersonaje = midlet.getXPersonaje();
        yPersonaje = midlet.getYPersonaje();
        puntoControlActual = midlet.getPuntoControl();
        System.out.println(puntoControlActual);
        if (estaShooter){
            adminPlataforma.terminar();
            adminPlataforma = null;
            if (puntoControlActual == this.nivel+1)
                adminShooter = new AdminShooter(this,ANCHO, ALTO, sexoPersonaje, nivel,Enemigo.JEFE);
            else
                adminShooter = new AdminShooter(this,ANCHO, ALTO, sexoPersonaje, nivel,Enemigo.SHOOTER);
        }else{
            adminPlataforma.heroe.setPosition(xPersonaje, yPersonaje);
        }

    }

    /**
     * Método que regresa la aplicación al cual pertenece el juego
     * @return el midlet que ejecuta al juego
     */
    public AppJuego getMidlet(){
        return midlet;
    }

    /**
     * Se encarga de mantener el juego al tanto de cualquier evento que se produzca, haciendo los cambios pertinentes en el mismo.
     * Lo llama el Animador del juego para hacer la animación.
     */
    public void actualizar(){
        if(pausado){
            if(!pausaCreada){
                try {
                    crearPausa();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                pausaCreada = true;
            }
            try {
                manejoPausa();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }else{
            if (pausaCreada){
                terminarPausa();
                pausaCreada = false;
            }
            manejoTiempo();
            formarInfo();
            try {
                if(adminShooter == null){
                    manejoPlataforma();
                    ponerShooter();
                }else if(adminPlataforma == null){
                    manejoShooter();
                    terminarShooter();
                }
           } catch (Exception ex) {
                    ex.printStackTrace();
           }
        }
    }

    //Método que se encarga de manejar el tiempo en base a un objeto de tipo Reloj
    private void manejoTiempo() {
        reloj.incrementar(1);
        if (reloj.getTiempo() % 17 == 0) {
            seg++;
            if (seg == 60) {
                seg = 0;
                min++;
            }
        }
    }

    //Método que se encarga de llenar el StringBuffer para desplegar la información en pantalla
    private void formarInfo(){
        info.delete(0,info.length());
        if (min < 10){
            //info.append("0"+min+":");
            info.append("0").append(min).append(":");
        }else{
            //info.append(min+":");
            info.append(min).append(":");
        }
        if (seg < 10){
            info.append("0").append(seg);
        }else{
            info.append(seg);
        }
        tiempo = info.toString();
        info.delete(0, info.length());
        info.append("Pts: ").append(puntajeTemp);
        scoreDesplegado = info.toString();
    }
    //Método que se encarga de los eventos del personaje en modo plataforma
    private void manejoPlataforma() {
        int tecla = getKeyStates();
        if((tecla & GAME_D_PRESSED)!=0 && !pausaCreada){
               pausado = true;
               return;
        }
        sangrePersonaje = getSangre();
        vidasPersonaje = getVidas();
        int x = adminPlataforma.heroe.getX();
        int y = adminPlataforma.heroe.getY();
        if(adminPlataforma.heroe.estaCayendo)
            adminPlataforma.heroe.move(0, GRAVEDAD);
        else
            adminPlataforma.heroe.move(0, 1);
        if((Heroe.SANGRE  <= 0  || adminPlataforma.heroe.estaMuriendo) || adminPlataforma.heroe.getY()>ALTO){
            if(!(adminPlataforma.heroe.getY()>ALTO)){
                if(adminPlataforma.heroe.estaCayendo){
                    adminPlataforma.heroe.move(0, -GRAVEDAD);
                    for (;;){
                        adminPlataforma.heroe.move(0, 1);
                        if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)){
                            adminPlataforma.heroe.move(0,-1);
                            break;
                        }
                    }
                }else{
                    adminPlataforma.heroe.move(0, -1);
                }
            }else{
                adminPlataforma.heroe.move(0, -GRAVEDAD);
            }
            adminPlataforma.heroe.morir();
            if(adminPlataforma.heroe.getFrame() == Heroe.ULTMUERTO){
                adminPlataforma.heroe.setPosition(xPersonaje, yPersonaje);
                adminPlataforma.heroe.caer();
                Heroe.SANGRE = 6;
                Heroe.VIDAS--;
            }
            if(Heroe.VIDAS <= 0){
                terminar();
                System.out.println(midlet.getScoreTemp());
                midlet.ponerPantalla(new Historia(midlet, sexoPersonaje, 5, puntajeGlobal));
                midlet = null;
                return;
            }
        } else if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true) || adminPlataforma.heroe.estaBrincando) {
            if(adminPlataforma.heroe.estaCayendo){
                adminPlataforma.heroe.move(0, -GRAVEDAD);
                for (;;){
                    adminPlataforma.heroe.move(0, 1);
                    if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)){
                        adminPlataforma.heroe.move(0,-1);
                        break;
                    }
                }
            }else{
                adminPlataforma.heroe.move(0, -1);
            }
            if(adminPlataforma.heroe.haSidoGolpeado){
                adminPlataforma.heroe.golpeado();
            }else if ((tecla & UP_PRESSED) != 0 || adminPlataforma.heroe.estaBrincando) {
                adminPlataforma.heroe.brincar();
                if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)) {
                    adminPlataforma.heroe.move(0, Heroe.MAX_BRINCO);
                    if (adminPlataforma.heroe.getFrame() == Heroe.ULTBRINCO-2){
                        System.out.println("entre ");
                        adminPlataforma.heroe.move(0, 2*Heroe.MAX_BRINCO);
                        adminPlataforma.heroe.caer();
                    }
                }
                if ((tecla & RIGHT_PRESSED) != 0) {
                    adminPlataforma.heroe.move(Heroe.VEL_DESP, 0);
                    if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)) {
                        adminPlataforma.heroe.move(-Heroe.VEL_DESP, 0);
                    }
                } else if ((tecla & LEFT_PRESSED) != 0) {
                    adminPlataforma.heroe.move(-Heroe.VEL_DESP, 0);
                    if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)) {
                        adminPlataforma.heroe.move(Heroe.VEL_DESP, 0);
                    }
                }
            } else if ((tecla & RIGHT_PRESSED) != 0) {
                adminPlataforma.heroe.correr(true);
                if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)) {
                    adminPlataforma.heroe.setPosition(x, y);
                }
            } else if ((tecla & LEFT_PRESSED) != 0) {
                adminPlataforma.heroe.correr(false);
                if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)) {
                    adminPlataforma.heroe.setPosition(x, y);
                }
            } else if ((tecla & DOWN_PRESSED) != 0) {
                adminPlataforma.heroe.agachar();
            } else if ((tecla & FIRE_PRESSED) != 0 || adminPlataforma.heroe.estaGolpeando) {
                adminPlataforma.heroe.golpear();
            } else if (tecla == 0) {
                adminPlataforma.heroe.parado();
            }
        } else {
            adminPlataforma.heroe.caer();
            if ((tecla & RIGHT_PRESSED) != 0) {
                adminPlataforma.heroe.setTransform(Sprite.TRANS_NONE);
                adminPlataforma.heroe.setPosition(x, y);
                adminPlataforma.heroe.move(Heroe.VEL_DESP, GRAVEDAD);
                if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)) {
                    adminPlataforma.heroe.move(-Heroe.VEL_DESP,0);
                }
            } else if ((tecla & LEFT_PRESSED) != 0) {
                adminPlataforma.heroe.setTransform(Sprite.TRANS_MIRROR);
                adminPlataforma.heroe.setPosition(x, y);
                adminPlataforma.heroe.move(-Heroe.VEL_DESP, GRAVEDAD);
                if (adminPlataforma.heroe.collidesWith(adminPlataforma.mapa, true)) {
                    adminPlataforma.heroe.move(Heroe.VEL_DESP,0);
                }
            }
        }
        puntajeTemp = adminPlataforma.puntaje;
        adminPlataforma.heroe.nextFrame();
        adminPlataforma.movimientoEnemigo();
    }
    //Método que se encarga de crear el Shooter en el momento indicado
    private void ponerShooter() throws Exception{
        if((adminPlataforma!=null) && (adminPlataforma.heroe.getX()+adminPlataforma.heroe.getWidth())>=(puntosControl[puntoControlActual])){
            estaShooter = true;
            g.drawImage(Image.createImage("/AlertaEnemigos.png"), 0, 0,Graphics.LEFT| Graphics.TOP);
            flushGraphics();
            Thread.sleep(500);
            puntoControlActual++;
            xPersonaje = adminPlataforma.heroe.getX();
            yPersonaje = adminPlataforma.heroe.getY();
            setPuntaje(adminPlataforma.puntaje);
            adminPlataforma.terminar();
            adminPlataforma = null;
            if(puntoControlActual == nivel+1)
                adminShooter = new AdminShooter(this,ANCHO, ALTO, sexoPersonaje, nivel, Enemigo.JEFE);
            else
                adminShooter = new AdminShooter(this,ANCHO, ALTO, sexoPersonaje, nivel,Enemigo.SHOOTER);

            puntajeGlobal = puntajeTemp;
            adminShooter.puntaje = puntajeTemp;
            adminShooter.heroe.setSangre(sangrePersonaje);
            adminShooter.heroe.setVidas(vidasPersonaje);
            if (midlet.deseaReproducir()){
                switch(nivel){
                    case 1:
                        midlet.reproducir("almost.mid");
                        break;
                    case 2:
                        midlet.reproducir("nemesis.mid");
                        break;
                    case 3:
                        midlet.reproducir("master.mid");
                        break;
                }
            }
            System.gc();
        }
    }
    //Método que termina el Shooter en el momento indicado y pone la Plataforma
    private void terminarShooter() throws Exception{
        if((adminShooter!=null) && (adminShooter.getEnemigosDerrotados() >= AdminShooter.MATAR_Y_PASAR || adminShooter.jefeDerrotado)){
            estaShooter = false;
            puntajeTemp = adminShooter.puntaje;
            puntajeGlobal = puntajeTemp;
            if (puntoControlActual == (nivel+1)){
                System.out.println(puntajeGlobal);
                terminar();
                midlet.ponerPantalla(new Historia(midlet,sexoPersonaje,nivel+1,puntajeGlobal));
                midlet = null;
                return;
            }
            adminShooter.terminar();
            adminShooter = null;
            adminPlataforma = new AdminPlataforma(this,ANCHO,ALTO, sexoPersonaje, nivel);
            adminPlataforma.puntaje = puntajeTemp;
            if(midlet.deseaReproducir()){
                midlet.detenerMusica();
                switch(nivel){
                    case 1:
                        midlet.reproducir("contrabando.mid");
                        break;
                    case 2:
                        midlet.reproducir("Clavado.mid");
                        break;
                    case 3:
                        midlet.reproducir("nymphetamine.mid");
                        break;
                    default:
                        break;
                }
            }
            adminPlataforma.heroe.setPosition(xPersonaje, yPersonaje);
            adminPlataforma.heroe.setSangre(sangrePersonaje);
            adminPlataforma.heroe.setVidas(vidasPersonaje);
            System.gc();
        }
    }
    //Método que se encarga de los eventos del heroe en el Shooter
    private void manejoShooter() {
        int tecla = getKeyStates();
        if((tecla & GAME_D_PRESSED)!=0 && !pausaCreada){
               pausado = true;
               return;
        }
        if(Heroe.SANGRE <= 0 || adminShooter.heroe.estaMuriendo){
            adminShooter.heroe.morir();
            adminShooter.heroe.nextFrame();
            if(adminShooter.heroe.getFrame() == Heroe.ULTMUERTO){
                Heroe.SANGRE = 6;
                Heroe.VIDAS--;
                adminShooter.heroe.estaMuriendo = false;
                adminShooter.heroe.setFrameSequence(null);
            }
            if(Heroe.VIDAS <= 0 || adminShooter.getCartuchos() <= 0){
                terminar();
                midlet.ponerPantalla(new Historia(midlet, sexoPersonaje, 5, puntajeGlobal));
                midlet = null;
                return;
            }
        }else if(adminShooter.heroe.estaCubierto){
            adminShooter.heroe.posicionShooter(true);
            if(((tecla & FIRE_PRESSED)!= 0)){
                adminShooter.recargarBalas();
            }
            if ((tecla & GAME_A_PRESSED)!= 0 && !botonApretado){
                adminShooter.heroe.posicionShooter(false);
                botonApretado = true;
            }else if(tecla == 0){
                botonApretado = false;
            }
        }else{
            int xMiraActual = adminShooter.getxMira();
            int yMiraActual = adminShooter.getyMira();
            adminShooter.heroe.posicionShooter(false);
            adminShooter.mira.setVisible(false);
            if((tecla & UP_PRESSED) != 0){
                adminShooter.setyMira(yMiraActual-Heroe.VEL_DESP*2);
            }
            if((tecla & DOWN_PRESSED) != 0){
                adminShooter.setyMira(yMiraActual+Heroe.VEL_DESP*2);
            }
            if((tecla & RIGHT_PRESSED) != 0){
                adminShooter.setxMira(xMiraActual+Heroe.VEL_DESP*2);
            }
            if((tecla & LEFT_PRESSED) != 0){
                adminShooter.setxMira(xMiraActual-Heroe.VEL_DESP*2);
            }
            if(((tecla & FIRE_PRESSED)!= 0) || adminShooter.estaDisparando){
                adminShooter.disparar();
            }else if ((tecla & GAME_A_PRESSED)!= 0 && !botonApretado){
                adminShooter.heroe.posicionShooter(true);
                botonApretado = true;
            }

            if(tecla == 0){
                botonApretado = false;
            }
        }
        puntajeTemp = adminShooter.puntaje;
    }
    //Método que se encarga de poner los puntos de control a lo largo de la Plataforma
    private void setControl(){
        puntoControlActual = 0;
        puntosControl = new int[nivel + 1];
        for (int i=0; i<puntosControl.length;i++){
            puntosControl[i] = ((adminPlataforma.mapa.getWidth()/(nivel+1))*(i+1));
        }
    }

    /**
     * Método que se usa para dibujar los elementos que aparecerán en pantalla. Se usa por el Animador para dibujar en el juego.
     */
    public void dibujar() {
        g.setColor(0x000000);
        g.fillRect(0, 0, ANCHO, ALTO);
        if(adminPlataforma != null){
            adminPlataforma.dibujar(g);
            if (!pausado){
                g.setColor(0xFFFFFF);
                g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
                g.drawString(tiempo, ANCHO, 0, Graphics.RIGHT|Graphics.TOP);
                g.drawString(scoreDesplegado, ANCHO, 20, Graphics.RIGHT|Graphics.TOP);
            }
        }else if(adminShooter != null){
            adminShooter.dibujar(g);
            if (!pausado){
                g.setColor(0xFFFFFF);
                g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
                g.drawString(tiempo, ANCHO, 0, Graphics.RIGHT|Graphics.TOP);
                g.drawString(scoreDesplegado, ANCHO, 20, Graphics.RIGHT|Graphics.TOP);
            }
        }
        int contador = 0;
        sangrePersonaje = Heroe.SANGRE;
        for(int i = 0; i<sangrePersonaje; i++){
            if(i%2==0){
                g.drawImage(corazon1, contador, 0, Graphics.LEFT|Graphics.TOP);
             }else{
                g.drawImage(corazon2, contador, 0, Graphics.LEFT|Graphics.TOP);
             }
            contador+=corazon1.getWidth();
        }
        contador = 0;
        vidasPersonaje = Heroe.VIDAS;
        for(int i = 0; i<vidasPersonaje; i++){
            g.drawImage(vida, contador, corazon1.getHeight(), Graphics.LEFT|Graphics.TOP);
            contador+=vida.getWidth();
        }
        if (pausado){
            if(pausaCreada){
                dibujarPausa();
            }
        }
        flushGraphics();
    }
    /**
     * Se manda llamar cuando el GameCanvas actual es obstruido por una pantalla de sistema del teléfono. Pone el modo pausado en el juego.
     */
    protected void hideNotify() {

        pausado = true;
    }

    /**
     * Cuando se libera el GameCanvas de una pantalla de sistema que esta obstruyéndolo.
     */

    protected void showNotify() {

    }

    //Método que se encarga de eliminar todas las referencias de la clase
    private void terminar(){
        midlet.analizar(puntajeGlobal);
        if(pausaCreada){
            terminarPausa();
        }
        if(adminPlataforma !=null){
            adminPlataforma.terminar();
            adminPlataforma = null;
        }
        if(adminShooter != null){
            adminShooter.terminar();
            adminShooter = null;
        }
        animador.terminar();
        animador = null;
        g = null;
        if(midlet.estaReproduciendo())
            midlet.detenerMusica();

    }

    //Metodo que regresa el valor de la sangre del Heroe
    private int getSangre() {
        return Heroe.SANGRE;
    }

    //Método que regresa  el valor de las vidas del heroe
    private int getVidas(){
        return Heroe.VIDAS;
    }
    //Método que crea la pausa en el juego
    private void crearPausa() throws IOException {
        System.gc();
        yMenuSel = 0;
        ySeleccion = yMenu[yMenuSel];
        xSegRein = xNoRein;
        if (midlet.deseaVibracion())
            xSelVib = xSiOp;
        else
            xSelVib = xNoOp;
        if(midlet.deseaReproducir())
            xSelSon = xSiOp;
        else
            xSelSon = xNoOp;
        xOpSal = xNoSal;
        imagenPausa = new Sprite(Image.createImage("/MenuPausaCompleto.png"),ANCHO,ALTO);
        mira = Image.createImage("/Mira"+sexoPersonaje+".png");

    }

    //Método que maneja los eventos en la pausa
    private void manejoPausa() throws Exception {
        int teclaPresionada = getKeyStates();
        if (imagenPausa.getFrame() == 0){
            if ((teclaPresionada & DOWN_PRESSED)!=0 && !botonApretado){
                yMenuSel++;
                if(yMenuSel >= yMenu.length)
                    yMenuSel = 0;
                ySeleccion = yMenu[yMenuSel];
                botonApretado = true;
            }else if((teclaPresionada & UP_PRESSED)!=0 && !botonApretado){
                yMenuSel--;
                if(yMenuSel < 0)
                    yMenuSel = yMenu.length - 1;
                ySeleccion = yMenu[yMenuSel];
                botonApretado = true;
            }else if((teclaPresionada & FIRE_PRESSED)!=0 && !botonApretado){
                switch(ySeleccion){
                    case(yCont):
                        pausado = false;
                        terminarPausa();
                        return;
                    case(yRein):
                        imagenPausa.setFrame(1);
                        break;
                    case(yOpcion):
                        imagenPausa.setFrame(2);
                        break;
                    case(yAyuda):
                        imagenPausa.setFrame(4);
                        break;
                    case(ySalir):
                        imagenPausa.setFrame(7);
                        break;
                    default:
                        break;
                }
                botonApretado = true;
            }else if(teclaPresionada == 0){
                botonApretado = false;
            }
        }else if(imagenPausa.getFrame() == 1){
            if((teclaPresionada & LEFT_PRESSED)!=0 && !botonApretado){
                xSegRein = xSiRein;
                botonApretado = true;
            }else if((teclaPresionada & RIGHT_PRESSED)!=0 && !botonApretado){
                xSegRein = xNoRein;
                botonApretado = true;
            }else if ((teclaPresionada & FIRE_PRESSED)!= 0 && !botonApretado){
                switch (xSegRein){
                    case xSiRein:
                        terminar();
                        midlet.ponerPantalla(new Juego(midlet,sexoPersonaje,nivel,puntajeGlobal));
                        midlet = null;
                        break;
                    case xNoRein:
                        imagenPausa.setFrame(0);
                        break;
                    default:
                        break;
                }
                botonApretado = true;
            }else if(teclaPresionada == 0){
                botonApretado = false;
            }
        }else if(imagenPausa.getFrame() == 2 || imagenPausa.getFrame() == 3){
            if((teclaPresionada & DOWN_PRESSED)!=0 && !botonApretado){
                imagenPausa.nextFrame();
                if(imagenPausa.getFrame()>3){
                    imagenPausa.setFrame(2);
                }
                botonApretado = true;
            }else if((teclaPresionada & UP_PRESSED)!=0 && !botonApretado){
                imagenPausa.prevFrame();
                if(imagenPausa.getFrame()<2){
                    imagenPausa.setFrame(3);
                }
                botonApretado = true;
            }else if((teclaPresionada & LEFT_PRESSED)!= 0 && !botonApretado && imagenPausa.getFrame()==2){
                xSelVib = xSiOp;
                midlet.cambiarDeseoVib(true);
                Display.getDisplay(midlet).vibrate(500);
                botonApretado = true;
            }else if((teclaPresionada & RIGHT_PRESSED)!= 0 && !botonApretado && imagenPausa.getFrame()==2){
                xSelVib = xNoOp;
                midlet.cambiarDeseoVib(false);
                botonApretado = true;
            }else if((teclaPresionada & LEFT_PRESSED)!= 0 && !botonApretado && imagenPausa.getFrame()==3){
                xSelSon = xSiOp;
                midlet.cambiarDeseoRep(true);
                botonApretado = true;
            }else if((teclaPresionada & RIGHT_PRESSED)!= 0 && !botonApretado && imagenPausa.getFrame()==3){
                xSelSon = xNoOp;
                midlet.cambiarDeseoRep(false);
                botonApretado = true;
            }else if((teclaPresionada & FIRE_PRESSED)!= 0 && !botonApretado){
                botonApretado = true;
                if(midlet.deseaReproducir() && !midlet.estaReproduciendo()){
                    if (!estaShooter){
                        switch(this.nivel){
                        case 1:
                            midlet.reproducir("contrabando.mid");
                            break;
                        case 2:
                            midlet.reproducir("Clavado.mid");
                            break;
                        case 3:
                            midlet.reproducir("nymphetamine.mid");
                            break;
                        }
                    }else{
                        switch(this.nivel){
                        case 1:
                            midlet.reproducir("almost.mid");
                            break;
                        case 2:
                            midlet.reproducir("nemesis.mid");
                            break;
                        case 3:
                            midlet.reproducir("master.mid");
                            break;
                        }
                    }
                }else if(!midlet.deseaReproducir() && midlet.estaReproduciendo()){
                    midlet.detenerMusica();
                }
                imagenPausa.setFrame(0);
            }else if (teclaPresionada == 0){
                botonApretado = false;
            }
        }else if(imagenPausa.getFrame() == 4 || imagenPausa.getFrame() == 5 || imagenPausa.getFrame() == 6){
            if ((teclaPresionada & LEFT_PRESSED)!=0 && !botonApretado){
                imagenPausa.prevFrame();
                if(imagenPausa.getFrame()<4){
                    imagenPausa.setFrame(6);
                }
                botonApretado = true;
            }else if((teclaPresionada & RIGHT_PRESSED)!= 0 && !botonApretado){
                imagenPausa.nextFrame();
                if(imagenPausa.getFrame()>6){
                    imagenPausa.setFrame(4);
                }
                botonApretado = true;
            }else if((teclaPresionada & FIRE_PRESSED)!= 0 && !botonApretado){
                imagenPausa.setFrame(0);
                botonApretado = true;
            }else if(teclaPresionada == 0){
                botonApretado = false;
            }
        }else if(imagenPausa.getFrame() == 7){
            if((teclaPresionada & LEFT_PRESSED)!=0 && !botonApretado){
                xOpSal = xSiSal;
                botonApretado = true;
            }else if((teclaPresionada & RIGHT_PRESSED)!=0 && !botonApretado){
                xOpSal = xNoSal;
                botonApretado = true;
            }else if ((teclaPresionada & FIRE_PRESSED)!=0 && !botonApretado){
                switch(xOpSal){
                    case (xSiSal):
                        terminar();
                        midlet.guardarJuego(nivel,sexoPersonaje,xPersonaje,yPersonaje,puntoControlActual, puntajeGlobal, estaShooter);
                        midlet.terminar();
                        return;
                    case(xNoSal):
                        imagenPausa.setFrame(0);
                        break;
                }
                botonApretado = true;
            }else if(teclaPresionada == 0){
                botonApretado = false;
            }
        }
    }
    //Método que termina la pausa
    private void terminarPausa() {
        imagenPausa = null;
        mira = null;
    }
    //Metodo que dibuja la pausa en el Graphics
    private void dibujarPausa() {
        imagenPausa.paint(g);
        switch (imagenPausa.getFrame()){
            case 0:
                g.drawImage(mira, ANCHO/2 , ySeleccion, Graphics.HCENTER|Graphics.VCENTER);
                break;
            case 1:
                g.drawImage(mira, xSegRein, ySegRein, Graphics.HCENTER|Graphics.VCENTER);
                break;
            case 2:
                g.drawImage(mira, xSelVib, yVibOp, Graphics.HCENTER|Graphics.VCENTER);
                g.drawImage(mira, xSelSon, ySonOp, Graphics.HCENTER|Graphics.VCENTER);
                break;
            case 3:
                g.drawImage(mira, xSelVib, yVibOp, Graphics.HCENTER|Graphics.VCENTER);
                g.drawImage(mira, xSelSon, ySonOp, Graphics.HCENTER|Graphics.VCENTER);
                break;
            case 7:
                g.drawImage(mira, xOpSal, ySal, Graphics.HCENTER|Graphics.VCENTER);
                break;
            default:
                break;
        }
    }
    //Método que vacía el puntaje dado al puntaje global
    private void setPuntaje(int puntaje) {
        puntajeGlobal = puntaje;
    }
}